package Reproductor;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.CannotWriteException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.KeyNotFoundException;
import org.jaudiotagger.tag.TagException;
import org.jaudiotagger.tag.id3.ID3v1Tag;
import org.jaudiotagger.tag.id3.ID3v24Frames;
import org.jaudiotagger.tag.id3.ID3v24Tag;
import org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag;

public abstract class Tagger {

	
	/**
	  * Actualiza informacion en el fichero de una cancion dada a partir de la
	  * informacion que se haya cambiado en nuestro reproductor.
	  * 
	  * @param c: cancion que va a ser cambiada, este parametro es el que
	  * esta ya actualizado y a partir del cual se van a realizar los cambios
	  * en la cancion en si.
	  */
	public static void actualizarCancion(Cancion c) {
		String ruta=c.getDireccionURL().getPath();
		String titulo=c.getTitulo();
		String artista=c.getArtista();
		String album=c.getAlbum();
		String numero=c.getNumero();
		
		//Si el fichero es MP3
		if (ruta.toLowerCase().endsWith(".mp3")){
			MP3File f;
			try {
				f =(MP3File) AudioFileIO.read(new File(ruta));
			
				if ((f.getID3v2TagAsv24()==null)){
					
					f.setTag(new ID3v24Tag());
				}

				f.getTag().setField(FieldKey.TITLE, titulo);

				f.getTag().setField(FieldKey.ARTIST, artista);

				f.getTag().setField(FieldKey.ALBUM, album);

				if (numero!="")
					f.getTag().setField(FieldKey.TRACK, numero);
			
				AudioFileIO.write(f);

			} 
			catch (CannotReadException e) {} 
			catch (IOException e) {} 
			catch (TagException e) {} 
			catch (ReadOnlyFileException e) {} 
			catch (InvalidAudioFrameException e) {} 
			catch (KeyNotFoundException e){}
		
			catch (CannotWriteException e) {}
			
		}	
	}
	

	/**
	  * Se da la ruta de la cancion y se obtienen sus atributos a partir del
	  * fichero de esa cancion.
	  * 
	  * @param ruta: la direccion donde se encuentra la cancion de la que
	  * queremos obtener los atributos.
	  * @return: la cancion obtenida a partir de la ruta donde sabiamos que se encontraba.
	  */
	public static Cancion conseguirValores(String ruta) {

		Cancion c= new Cancion();
		String titulo="";
		String artista="";
		String album="";
		String numero="";
		String formato="";
		String duracion="0";
			if (ruta.toLowerCase().endsWith(".mp3")){
				MP3File f;
				try {
					f =(MP3File) AudioFileIO.read(new File(ruta));
					ID3v1Tag v1Tag = f.getID3v1Tag();
					if (f.getTag()!=null){
						if (!f.getTag().getFields(ID3v24Frames.FRAME_ID_TITLE).isEmpty())
							titulo=f.getTag().getFirst(ID3v24Frames.FRAME_ID_TITLE);
						if (!f.getTag().getFields(ID3v24Frames.FRAME_ID_ARTIST).isEmpty())
							artista=f.getTag().getFirst(ID3v24Frames.FRAME_ID_ARTIST);
						if (!f.getTag().getFields(ID3v24Frames.FRAME_ID_ALBUM).isEmpty())
							album=f.getTag().getFirst(ID3v24Frames.FRAME_ID_ALBUM);
						if (!f.getTag().getFields(ID3v24Frames.FRAME_ID_TRACK).isEmpty())
							numero=f.getTag().getFirst(ID3v24Frames.FRAME_ID_TRACK);
						if (!f.getTag().getFields(ID3v24Frames.FRAME_ID_LENGTH).isEmpty())
							duracion=f.getTag().getFirst(ID3v24Frames.FRAME_ID_LENGTH);
					}
					formato="mp3";

					String[] tituloAux;
					//En el caso que no encuentre el titulo
					if (titulo.equals("")){
						
						if(System.getProperty("os.name").equals("Linux")){
							//Troceo la cadena por el separador "/"
							tituloAux=ruta.split("/");	
						}
						else{		
							//Troceo la cadena por el separador "//"
							tituloAux=ruta.split("\\\\");	
						}
	
						//Obtenemos el nombre de la cancion, que es su ultima posicion
						titulo= tituloAux[tituloAux.length-1];
						//Recorto la cadena para no mostrar ".mp3"
						titulo=titulo.substring(0, titulo.length()-4);			
					} 
				} 
				catch (CannotReadException e) {} 
				catch (IOException e) {} 
				catch (TagException e) {} 
				catch (ReadOnlyFileException e) {} 
				catch (InvalidAudioFrameException e) {}	
			}
			else if (ruta.toLowerCase().endsWith(".ogg")){
				AudioFile f;			
				try {
					f = AudioFileIO.read(new File(ruta));
					
					VorbisCommentTag ovtag = (VorbisCommentTag)f.getTag(); 
					if (ovtag!=null){
			
						titulo= ((VorbisCommentTag)f.getTag()).getFirst("TITLE");
						
						//En el caso que no encuentre el titulo
						if (titulo.equals("")){
							//Troceo la cadena por el separador "/"
							String[] tituloAux=ruta.split("//");		
							//Obtenemos el nombre de la cancion, que es su ultima posicion
							titulo= tituloAux[tituloAux.length-1];
							//Recorto la cadena para no mostrar ".mp3"
							titulo=titulo.substring(0, titulo.length()-4);			
						}
						artista= ((VorbisCommentTag)f.getTag()).getFirst("ARTIST");
						album= ((VorbisCommentTag)f.getTag()).getFirst("ALBUM");
						formato=".ogg";
						numero = ((VorbisCommentTag)f.getTag()).getFirst("TRACKNUMBER");
					}
				
				} 
				catch (CannotReadException e) {} 
				catch (IOException e) {} 
				catch (TagException e) {} 
				catch (ReadOnlyFileException e) {} 
				catch (InvalidAudioFrameException e) {}
			}

			c.setTitulo(titulo);
			c.setArtista(artista);
			c.setAlbum(album);
			c.setNumero(numero);
			c.setFormato(formato);
			return c;
		}		

}
